#![allow(dead_code)]
use sea_orm::{DatabaseConnection, Statement, ExecResult};
use sea_orm::ConnectionTrait;
use log::{info};
use crate::utils::db_util::DBUtil;
use anyhow::Context;

const CURRENT_VERSION: i32 = 0; // 当前最新版本号

/// 运行数据库迁移
pub async fn run_migrations(db_util: &DBUtil) -> anyhow::Result<()> {
    let conn = db_util.get_connection();

    let current_version = get_current_version(conn).await
        .context("获取数据库版本失败")?;

    if current_version >= CURRENT_VERSION {
        info!("数据库已是最新版本: {}", current_version);
        return Ok(());
    }

    info!("检测到数据库版本 {}, 正在升级至 {}", current_version, CURRENT_VERSION);

    for version in (current_version + 1)..=CURRENT_VERSION {
        match version {
            0 if current_version == -1 => init_database(&conn).await?, // 特殊处理全新数据库的情况
            1 => migrate_v0_to_v1(&conn).await?,
            _ => panic!("未定义版本 {} 的迁移逻辑", version),
        }
        set_version(&conn, version).await
            .with_context(|| format!("设置数据库版本 {} 失败", version))?;
    }

    Ok(())
}

/// 获取当前数据库版本
async fn get_current_version(conn: &DatabaseConnection) -> anyhow::Result<i32> {
    // 检查是否存在任何表（判断是否是全新数据库）
    let table_count_sql = r#"
        SELECT COUNT(*) FROM sqlite_master WHERE type='table'
    "#;

    let result = conn.query_all(Statement::from_string(
        conn.get_database_backend(),
        table_count_sql.to_string()
    )).await?;

    if let Some(row) = result.first() {
        let count: i32 = row.try_get("", "COUNT(*)")?;
        if count == 0 {
            return Ok(-1);  // 特殊标记：数据库存在但没有表
        }
    }

    // 获取数据库版本号
    let result = conn.query_all(Statement::from_string(
        conn.get_database_backend(),
        "PRAGMA user_version;".to_string()
    )).await?;

    let version = match result.first() {
        Some(row) => row.try_get("","user_version")?,
        None => 0,
    };

    Ok(version)
}

// 修改 set_version 函数，添加更多上下文日志
// 修改 set_version 函数，避免使用参数化查询
async fn set_version(conn: &DatabaseConnection, version: i32) -> anyhow::Result<ExecResult> {
    info!("正在设置数据库版本为 {}", version);

    // 直接拼接 SQL，SQLite 的 PRAGMA 不支持参数绑定
    let sql = format!("PRAGMA user_version = {}", version);
    let stmt = Statement::from_string(conn.get_database_backend(), sql);

    match conn.execute(stmt).await {
        Ok(result) => {
            info!("成功设置数据库版本为 {}", version);
            Ok(result)
        },
        Err(e) => {
            log::error!("设置数据库版本 {} 失败，错误详情: {:?}", version, e);
            Err(e.into())
        }
    }
}


/// 初始化数据库结构（当数据库为空时调用）
async fn init_database(conn: &DatabaseConnection) -> anyhow::Result<()> {
    info!("初始化新的数据库结构");

    // 创建示例表
    let sql = r#"
-- 账号监控表（字段名已改为蛇形命名法）
CREATE TABLE account_info (
    id INTEGER PRIMARY KEY AUTOINCREMENT,  -- 主键,自增
    off_on INTEGER NOT NULL DEFAULT 1,      -- 监控开关(1=开启,0=关闭)
    zh TEXT NOT NULL,                      -- 账号
    zh_type TEXT NOT NULL DEFAULT -1,       -- 账号类型(1=QQ安卓,2=QQ苹果,3=微信安卓,4=微信苹果)
    wgname TEXT,                           -- 玩家游戏昵称
    serid TEXT,                            -- 区服ID
    ser TEXT,                              -- 区服

    ydstatus INTEGER DEFAULT -1,           -- 营地状态(枚举值)
    erjpwd INTEGER DEFAULT -1,             -- 二级密码
    zb_short TEXT,                         -- 装备简短描述
    jwstatus INTEGER DEFAULT -1,           -- 禁玩状态(枚举值)

    fhremark TEXT,                         -- 错误描述备注
    remark TEXT,                           -- 用户备注
    usort INTEGER DEFAULT 0,               -- 排序
    create_time TIMESTAMP DEFAULT (datetime('now', '+8 hours')), -- 创建时间
    update_time TIMESTAMP DEFAULT (datetime('now', '+8 hours')), -- 修改时间

    ydstatus_time TIMESTAMP,               -- 营地状态最后同步时间
    ejpwd_time TIMESTAMP,                  -- 二级密码最后同步时间
    zb_time TIMESTAMP,                     -- 装备信息最后同步时间
    jwstatus_time TIMESTAMP,               -- 禁玩状态最后同步时间

    hjstatus_time TIMESTAMP,               -- 货架状态最后同步时间
    zh_cfg TEXT,                           -- 账号配置(建议JSON格式)

    zhw_hid TEXT,                          -- zhw货架
    zhw_zt TEXT,                           -- zhw状态(枚举值)
    zhw_money TEXT,                        -- zhw单价(存储分为单位的金额)

    uhz_hid TEXT,                          -- uhz货架
    uhz_zt TEXT,                           -- uhz状态(枚举值)
    uhz_money TEXT,                        -- uhz单价(存储分为单位的金额)

    zz_hid TEXT,                           -- zz货架
    zz_zt TEXT,                            -- zz状态(枚举值)
    zz_money TEXT                          -- zz单价(存储分为单位的金额)
);

-- 添加自动更新修改时间的触发器
CREATE TRIGGER update_account_info_timestamp
AFTER UPDATE ON account_info
FOR EACH ROW
BEGIN
    UPDATE account_info
    SET update_time = CURRENT_TIMESTAMP
    WHERE id = OLD.id;
END;

-- 为高频查询字段添加索引（索引名同步改为蛇形）
CREATE INDEX idx_zh_type ON account_info (zh_type);
CREATE INDEX idx_wgname ON account_info (wgname); -- 原字段已是小写，无需修改
CREATE UNIQUE INDEX IF NOT EXISTS idx_zh_unique ON account_info (zh);
        "#;

    conn.execute(Statement::from_string(
        conn.get_database_backend(),
        sql.to_string()
    )).await?;

    Ok(())
}

// ===== 迁移脚本 =====

/// 版本0 → 1的升级：创建基础表结构
async fn migrate_v0_to_v1(conn: &DatabaseConnection) -> anyhow::Result<()> {
    info!("正在执行 v0 → v1 升级...");

    // 创建用户表
    conn.execute(Statement::from_string(
        conn.get_database_backend(),
        r#"
        CREATE TABLE IF NOT EXISTS users (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            name TEXT NOT NULL,
            email TEXT NOT NULL UNIQUE
        )
        "#.to_string()
    )).await?;

    // 创建索引
    conn.execute(Statement::from_string(
        conn.get_database_backend(),
        "CREATE INDEX idx_users_email ON users(email)".to_string()
    )).await?;

    Ok(())
}
